package cn.remex.task;

import cn.remex.core.exception.ServiceCode;
import cn.remex.core.quartz.Job;
import cn.remex.core.util.Assert;
import cn.remex.db.Database;
import cn.remex.task.model.SysTask;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import static cn.remex.task.TaskConst.ProcessStatus.FINISH;

/**
 * 名称：
 * 缩写：
 * 用途：
 * Created by yangy on 2016/12/24 0024.
 *
 * dev by lxt
 * review by lhy 17/1/13
 */
public class TaskControllerDaemon extends Job implements TaskConst {

	@Override
	public void jobExecute(JobExecutionContext ctx) throws JobExecutionException {
		/*
		管理分析器下的job  ，将以完成的，错误的，失败的，任务移出当前队列。并且停止该job
		 */
		SysTask curSysTask = (SysTask) ctx.getJobDetail().getJobDataMap().get("CreditAnalyzerConfig");
		logger.info("分析器 {} 守护线程心跳服务: 失败重启={} ,上次={}, 下次={}", curSysTask.key(), ctx.getRefireCount(), ctx.getPreviousFireTime(), ctx.getNextFireTime());

		TaskController curTaskController = TaskCenter.obtainCurTaskControllers(curSysTask);//获取对应的分析器
		Assert.notNull(curTaskController, ServiceCode.FAIL, "分析器守护线程中没有对应的分析器, 任务异常终止, relationId="+curSysTask.getRelationId());

		//处理过期的job
		curTaskController.checkAndRemoveCreditJob();

		//将新任务添加到
		curTaskController.checkAndBootCreditJob();

		//如果当前分析器没有 可用的Job ，则认为当前分析器 已经结束。则停止该分析器
		if (curTaskController.getCurMatters().size() == 0) {
			logger.info("分析器任务处理完成，标记分析器为FINISH，key={}", curSysTask.key());
			curTaskController.setCurStatus(FINISH);
			curSysTask.setProcessStatus(FINISH);//
			Database.update(SysTask.class)
					.assignColumn(SysTask::getProcessStatus, FINISH)
					.filterById(curSysTask.getId())
					.execute();
		}
	}
}
